package com.sniper.mybatis.service;

import com.sniper.util.PageUtil;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * @author suzhen
 */
public interface BaseService<T> {

    /**
     * @param t
     * @return
     */
    @Transactional
    int insert(String sqlId, T t);

    /**
     * @param t
     * @return
     */
    @Transactional
    int insert(T t);

    /**
     * @param t
     * @return
     */
    @Transactional
    int update(String sqlId, T t);

    /**
     * @param t
     * @return
     */
    @Transactional
    int update(T t);

    /**
     * @param sqlId
     * @param id
     * @return
     */
    @Transactional
    int delete(String sqlId, String id);

    /**
     * @param id
     * @return
     */
    @Transactional
    int delete(String id);

    /**
     * @param sqlId
     * @param params
     * @return
     */
    @Transactional()
    int delete(String sqlId, Map<String, Object> params);

    /**
     * @param id
     * @return
     */
    T get(String sqlId, String id);

    /**
     * @param id
     * @return
     */
    @Transactional
    T get(String id);

    /**
     * @param sqlId
     * @param params
     * @return
     */
    List<T> query(String sqlId, Map<String, Object> params);

    /**
     * 调用select 默认查询方法
     *
     * @param params
     * @return
     */
    List<T> query(Map<String, Object> params);

    /**
     * 查询map
     *
     * @param sqlId
     * @param params
     * @return
     */
    List<Map<String, Object>> queryMap(String sqlId, Map<String, Object> params);

    /**
     * @param sqlId
     * @param params
     */
    void executeSql(String sqlId, Map<String, Object> params);

    /**
     * 批量新增
     *
     * @param sqlId
     * @param list
     * @return
     */
    int batchInsert(String sqlId, List<T> list);

    /**
     * 批量修改
     *
     * @param sqlId
     * @param list
     * @return
     */
    int batchUpdate(String sqlId, List<T> list);

    /**
     * 分页
     *
     * @param params
     * @return
     */
    int pageCount(Map<String, Object> params);

    /**
     * @param params
     * @return
     */
    List<T> pageList(Map<String, Object> params);

    /**
     * 集成分页,如果修改具体分页实现可以修改它
     *
     * @param request
     * @param pageSize
     * @param params
     * @return
     */
    PageUtil<T> page(HttpServletRequest request, int pageSize, Map<String, Object> params);

    /**
     * 获取一些单一结果的 比如技术数，
     *
     * @param sqlId
     * @param params
     * @return
     */

    Object find(String sqlId, Map<String, Object> params);

    /**
     * @param params
     * @return
     */
    Object find(Map<String, Object> params);


}
